﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.IO;
using OpenCvSharp;
using OpenCvSharp.MachineLearning;
using OpenCvSharp.Blob;
using OpenCvSharp.UserInterface;
using OpenCvSharp.CPlusPlus;

namespace RecognitionNumbers
{
    public class SearchAndRecognition : Filter
    {
    
   
       
        НастройкиПоискНомера настройкиПоискНомера;
        НастройкиПоискаСимволов настройкиПоискСимволов;
        List<MatrixSymbol> матрицыСимволов;
        SearchRectangle поискПрямоугольника;

        public SearchAndRecognition(НастройкиПоискНомера настройкиПоискНомера, НастройкиПоискаСимволов настройкиПоискСимволов,   List<MatrixSymbol> матрицыСимволов)
        {
            
            this.настройкиПоискНомера = настройкиПоискНомера;
            this.настройкиПоискСимволов = настройкиПоискСимволов;
            this.матрицыСимволов = матрицыСимволов;
         
        }

        public List<Number> go(Image image, bool education)
        {
            List<Number> n=new List<Number>();
            original = image.image;
           
            DateTime time = DateTime.Now;
            поискПрямоугольника = new SearchRectangle(image.image, настройкиПоискНомера.порогБинаризации, настройкиПоискНомера.процентЦветных, настройкиПоискНомера.процентЧерногоНиз, настройкиПоискНомера.процентЧерногоВерх, настройкиПоискНомера.соотношениеСторон, настройкиПоискНомера.отклонениеСторон);
        
           
            SearchSymbol поискСимволов;
            if (поискПрямоугольника.coordinatesRectangle.Count >= 1)
                foreach (IplImage p in поискПрямоугольника.imageRectangle)
                { 
                    поискСимволов = new SearchSymbol(p, настройкиПоискСимволов.порогБинаризации, настройкиПоискСимволов.радиус, настройкиПоискСимволов.размер, настройкиПоискСимволов.отклонениеРазмер, настройкиПоискСимволов.соотношениеСторон, настройкиПоискСимволов.отклонениеСторон);
                    if (поискСимволов.coordinatesRectangle.Count >= 5)
                    {
                        if (education)
                        {

                            Обучение f = new Обучение(  матрицыСимволов, поискСимволов);

                            f.ShowDialog();
                            Number t = new Number();
                            t.education = true;
                            n.Add(t);
                        }
                        else
                        {
                            Number t = new Number();
                            t.text = "";
                            t.numeber = поискСимволов.input;
                            t.sybol = поискСимволов.изображениеПрямоугольников;
                           int poz=1;
                            foreach (IplImage po in поискСимволов.imageRectangle)
                            {

                                double min = 100000000000;
                                char c = ' ';
                                foreach (MatrixSymbol m in матрицыСимволов)
                                {
                                    if ((((poz == 1) | (poz == 5) | (poz == 6)) & (m.symbol >= 'А')) | (((poz == 2) | (poz == 3) | (poz == 4) | (poz > 6)) & (m.symbol < 'А')))
                                    {
                                        double u = m.compare(po);
                                        if (min > u)
                                        {
                                            min = u;
                                            c = m.symbol;
                                        }
                                    } 
                                }
                                    t.text += c;
                               
                                poz++;

                            }
                            t.time = DateTime.Now;
                            t.education = false;
                            n.Add(t);
                        }
                    }
                }
            transformed = поискПрямоугольника.output;
            
            return n;
        }

        public List<Number> go(Image image, bool education, List<Rectangle> rect)
        {
            List<Number> n = new List<Number>();
            original = image.image;

            DateTime time = DateTime.Now;
            поискПрямоугольника = new SearchRectangle(image.image, настройкиПоискНомера.порогБинаризации, настройкиПоискНомера.процентЦветных, настройкиПоискНомера.процентЧерногоНиз, настройкиПоискНомера.процентЧерногоВерх, настройкиПоискНомера.соотношениеСторон, настройкиПоискНомера.отклонениеСторон,rect);


            SearchSymbol поискСимволов;
            if (поискПрямоугольника.coordinatesRectangle.Count >= 1)
                foreach (IplImage p in поискПрямоугольника.imageRectangle)
                {
                    поискСимволов = new SearchSymbol(p, настройкиПоискСимволов.порогБинаризации, настройкиПоискСимволов.радиус, настройкиПоискСимволов.размер, настройкиПоискСимволов.отклонениеРазмер, настройкиПоискСимволов.соотношениеСторон, настройкиПоискСимволов.отклонениеСторон);
                    if (поискСимволов.coordinatesRectangle.Count >= 5)
                    {
                        if (education)
                        {

                            Обучение f = new Обучение(матрицыСимволов, поискСимволов);

                            f.ShowDialog();
                            Number t = new Number();
                            t.education = true;
                            n.Add(t);
                        }
                        else
                        {
                            Number t = new Number();
                            t.text = "";
                            t.numeber = поискСимволов.input;
                            t.sybol = поискСимволов.изображениеПрямоугольников;
                            int poz=1;
                            foreach (IplImage po in поискСимволов.imageRectangle)
                            {

                                double min = 100000000000;
                                char c = ' ';
                                foreach (MatrixSymbol m in матрицыСимволов)
                                {
                                    if ((((poz == 1) | (poz == 5) | (poz == 6)) & (m.symbol >= 'А')) | (((poz == 2) | (poz == 3) | (poz == 4) | (poz > 6)) & (m.symbol < 'А')))
                                    {
                                        double u = m.compare(po);
                                        if (min > u)
                                        {
                                            min = u;
                                            c = m.symbol;
                                        }
                                    }
                                }
                                t.text += c;
                                poz++;

                            }
                            t.time = DateTime.Now;
                            t.education = false;
                            n.Add(t);
                        }
                    }
                }
            transformed = поискПрямоугольника.output;

            return n;
        }

        
    }
}
